package br.org.acessobrasil.portal.action;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

import br.com.goals.tableedit.util.MD5;
import br.org.acessobrasil.portal.Gerenciador;
import br.org.acessobrasil.portal.modelo.Conteudo;
import br.org.acessobrasil.portal.modelo.Formato;
import br.org.acessobrasil.portal.modelo.InformacaoTipoConteudo;
import br.org.acessobrasil.portal.modelo.ItemMenu;
import br.org.acessobrasil.portal.modelo.Menu;
import br.org.acessobrasil.portal.modelo.PadraoApresentacao;
import br.org.acessobrasil.portal.modelo.Pagina;
import br.org.acessobrasil.portal.modelo.Perfil;
import br.org.acessobrasil.portal.modelo.PerfilAcao;
import br.org.acessobrasil.portal.modelo.Privilegio;
import br.org.acessobrasil.portal.modelo.Setor;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.TipoConteudo;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.ConteudoDaoSpring;
import br.org.acessobrasil.portal.persistencia.FormatoDaoSpring;
import br.org.acessobrasil.portal.persistencia.InformacaoTipoConteudoDao;
import br.org.acessobrasil.portal.persistencia.ItemMenuDaoSpring;
import br.org.acessobrasil.portal.persistencia.MenuDaoSpring;
import br.org.acessobrasil.portal.persistencia.PadraoApresentacaoDaoSpring;
import br.org.acessobrasil.portal.persistencia.PaginaDaoSpring;
import br.org.acessobrasil.portal.persistencia.PerfilDaoSpring;
import br.org.acessobrasil.portal.persistencia.PrivilegioDao;
import br.org.acessobrasil.portal.persistencia.PrivilegioDaoSpring;
import br.org.acessobrasil.portal.persistencia.SetorDao;
import br.org.acessobrasil.portal.persistencia.SitioDaoSpring;
import br.org.acessobrasil.portal.persistencia.TipoConteudoDaoSpring;
import br.org.acessobrasil.portal.persistencia.UsuarioDaoSpring;

/**
 * Respons�vel por verificar a instala��o do sistema<br>
 * caso n�o esteja instalado instala.<br>
 * Futuramente:<br>
 * 
 * @author Fabio Issamu Oshiro, Daniel Zupo, Jonatas Pacheco
 * 
 */
@Transactional
public class Instalador extends Super {
	private static final long serialVersionUID = -2440930721709565029L;
	private static Logger logger = Logger.getLogger(Instalador.class);
	private static UsuarioDaoSpring usuarioDao;
	private static PerfilDaoSpring perfilDao;
	private static SetorDao setorDao;
	private static PrivilegioDao privilegioDao;
	private static SitioDaoSpring sitioDao;
	private static PaginaDaoSpring paginaDao;
	private static PadraoApresentacaoDaoSpring padraoApresentacaoDao;
	private static TipoConteudoDaoSpring tipoConteudoDao;
	private static FormatoDaoSpring formatoDao;
	private static InformacaoTipoConteudoDao informacaoTipoConteudoDao;
	private static MenuDaoSpring menuDao;
	private static ItemMenuDaoSpring itemMenuDao;
	private static ConteudoDaoSpring conteudoDao;

	private Formato formatoTextoUmaLinha = new Formato("Texto 1 linha", "Texto com uma linha");
	private Formato formatoNumero = new Formato("N&uacute;mero", "N&uacute;mero");
	private Formato formatoImagem = new Formato("Imagem", "Campo para colocar imagem");
	private Formato formatoData = new Formato("Data", "Campo para data");
	private Formato formatoTextoMultiLinha = new Formato("Texto com mais de uma linha", "Texto com mais de uma linha");
	private Formato formatoArquivoFlash = new Formato("Arquivo Flash", "Arquivo flash (*.swf)");
	private Formato formatoLinkExterno = new Formato("Link externo", "Link para outro dom&iacute;nio");
	private Formato formatoLinkExternoNaoVazio = new Formato("Link externo n&atilde;o vazio", "Se for \"\" ent&atilde;o retira a tag a");
	private Formato formatoTextoWYSIWYG = new Formato("Texto com formata&ccedil;&atilde;o", "Texto WYSIWYG");
	private Formato formatoAutoCompletavel = new Formato("Texto Auto Complet&iacute;vel", "Texto que procura uma ocorr&ecirc;ncia parecida, utiliza ajax");
	private Formato formatoArquivoDeDownload = new Formato("Arquivo para \"download\"", "Arquivo para o internauta baixar");

	public static final String SENHA_INICIAL = "acessibilidade";
	private Usuario rootSys = null;

	public Instalador(UsuarioDaoSpring usuarioDao, PerfilDaoSpring perfilDao, SetorDao setorDao, SitioDaoSpring sitioDao, PrivilegioDaoSpring privilegioDao, PaginaDaoSpring paginaDao, PadraoApresentacaoDaoSpring padraoApresentacaoDao, MenuDaoSpring menuDao,
			ItemMenuDaoSpring itemMenuDao, TipoConteudoDaoSpring tipoConteudoDao, FormatoDaoSpring formatoDao, InformacaoTipoConteudoDao informacaoTipoConteudoDao, ConteudoDaoSpring conteudoDao) {

		Instalador.usuarioDao = usuarioDao;
		Instalador.perfilDao = perfilDao;
		Instalador.setorDao = setorDao;
		Instalador.sitioDao = sitioDao;
		Instalador.privilegioDao = privilegioDao;
		Instalador.paginaDao = paginaDao;
		Instalador.padraoApresentacaoDao = padraoApresentacaoDao;
		Instalador.menuDao = menuDao;
		Instalador.itemMenuDao = itemMenuDao;
		Instalador.tipoConteudoDao = tipoConteudoDao;
		Instalador.formatoDao = formatoDao;
		Instalador.informacaoTipoConteudoDao = informacaoTipoConteudoDao;
		Instalador.conteudoDao = conteudoDao;
	}

	public Instalador() throws Exception {
		if (usuarioDao == null) {
			logger.error("UsuarioDao = null, verifique os construtores do Instalador no applicationContext.xml");
		}
	}

	/**
	 * Metodo executado em instalar.action
	 */
	public String execute() {
		verificarInstalacao();
		return SUCCESS;
	}

	/**
	 * Verifica a instalacao<br>
	 * caso nao esteja instalado chama o metodo instalar
	 * 
	 */
	@Transactional
	private String verificarInstalacao() {
		try {
			if (usuarioDao.select(1L) == null) {
				instalar();
			}
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error("Erro ao verificar a Instalacao ", e);
			throw new RuntimeException();
		}
		return SUCCESS;
	}

	/**
	 * Cria um perfil, setor e usu�rio administrador
	 * 
	 * @throws Exception
	 */
	private void instalar() throws Exception {
		criarFormato();
		Sitio sitio = criarSitio();
		rootSys = new Usuario();
		rootSys.setCoAtivo(true);
		rootSys.setCoMatricula("");
		rootSys.setCoSenha(MD5.toPassword(SENHA_INICIAL));
		rootSys.setCoUsuario("root");
		rootSys.setDtAlteracao(new Date());
		rootSys.setDtCriacao(new Date());
		rootSys.setNoEmail("administrador@email.com");
		rootSys.setNoUsuario("Administrador");
		rootSys.setNuTelefone("1234-4567");
		rootSys.setNuHierarquia(0);

		usuarioDao.create(rootSys);
		criarConteudistaPro();

		criarSitioBase(sitio);
		addActionMessage("O sistema foi instalado.");
		addActionMessage("O usu&aacute;rio &eacute; root a senha &eacute; " + SENHA_INICIAL + ".");
		addActionMessage("Por favor, entre no sistema e troque a senha.");
	}

	/**
	 * Cria o item de menu para a pagina
	 * 
	 * @param titulo
	 *            Titulo do link (label)
	 * @param pagina
	 *            pagina para onde aponta o link
	 * @param menu
	 *            menu para onde sera colocado o item
	 * @return Item de menu criado
	 */
	private ItemMenu criarItemMenu(String titulo, Pagina pagina, Menu menu) {
		ItemMenu itemMenu = new ItemMenu();
		itemMenu.setNoTitulo(titulo);
		itemMenu.setNuPagina(pagina.getNuPagina());
		itemMenu.setNuMenu(menu.getNuMenu());
		itemMenu.setNuNivel(1);
		if (menu.getListItemMenu() == null) {
			itemMenu.setNuOrdem(1);
			List<ItemMenu> listItemMenu = new ArrayList<ItemMenu>();
			listItemMenu.add(itemMenu);
			menu.setListItemMenu(listItemMenu);
		} else {
			itemMenu.setNuOrdem(menu.getListItemMenu().size() + 1);
		}
		itemMenuDao.create(itemMenu);
		// itemMenuDao.reordenar(menu.getNuMenu());
		pagina.setNuItemMenuSecao(itemMenu.getNuItemMenu());
		paginaDao.update(pagina);
		return itemMenu;
	}

	public Menu criarMenuPrincipal(Sitio sitio) throws Exception {
		Menu menu = new Menu();
		menu.setNoMenu("Menu do s&iacute;tio " + sitio.getNoSitio());
		menu.setSitio(sitio);
		menuDao.create(menu);
		sitio.setNuMenuPrincipal(menu.getNuMenu());
		sitioDao.update(sitio);
		return menu;
	}

	private PadraoApresentacao criarPadraoApresentacao(Sitio sitio) {
		PadraoApresentacao padraoApresentacao = new PadraoApresentacao();
		try {
			// ler do arquivo de template
			File dirTemplateDefault = new File(getServletContext().getRealPath(InstalarTemplateAction.PASTA_TEMPLATE + "/default"));
			File arqHtmlTemplate = new File(dirTemplateDefault, "index.html");
			String strTemplate = FileUtils.readFileToString(arqHtmlTemplate, "utf-8");
			padraoApresentacao.setDePadraoApresentacao(strTemplate);
		} catch (Exception e) {
			addActionError("Erro ao colocar o template default " + e.getMessage() + " foi instalado o b&aacute;sico.");
			logger.error("Erro: Talvez o arquivo index.html na pasta templates/default nao exista", e);
			padraoApresentacao
					.setDePadraoApresentacao("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
							+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"pt\" lang=\"pt-br\">\n"
							+ "<head>\n"
							+ "<title>Seu site - <!-- ini titulo pagina -->Titulo<!-- fim titulo pagina --></title>\n"
							+ "<meta name=\"Description\" content=\"pagina principal\" />\n"
							+ "<meta name=\"Keywords\" content=\"assistivo, assistivas, defici&ecirc;ncia, visual, braille, DAISY, ferramentas, cego, baixa vis&atilde;o, catarata, glaucoma, degenera&ccedil;&atilde;o, bengala, linha braille, impressora, amplia&ccedil;&atilde;o &oacute;tica, amplia&ccedil;&atilde;o eletr&ocirc;nica, leitor aut&ocirc;nomo, leitor de diagramas, leitor, orienta&ccedil;&atilde;o, mobilidade, acessibilidade, sistemas inform&aacute;ticos, software educacional, lupa, &oacute;culos, teclados, ocr, ampliador,DOSVOX \" />\n"
							+ "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />\n" + "<meta name=\"Author\" content=\"Fabio Issamu Oshiro, Haroldo Veiga, Jonatas Pacheco Ribeiro, Daniel Zupo, Renato Nati, Clemilson Barcelos Teixeira, Enrique Baliosian\" />\n"
							+ "<meta name=\"Robots\" content=\"index,follow\" />\n" + "<script type=\"text/javascript\" src=\"extras/acessibilidade.js\"></script>\n" + "</head>\n" + "<body>\n" + "<noscript><p>Conte&uacute;do alternativo</p></noscript>\n" + "</body>\n"
							+ "</html>"

					);
		}
		padraoApresentacao.setNoPadrao("Principal");
		padraoApresentacao.setSitio(sitio);
		padraoApresentacao.setStSituacao('p');
		padraoApresentacaoDao.create(padraoApresentacao);
		return padraoApresentacao;
	}

	/**
	 * Cria o sitio padrao do sistema
	 * 
	 * @return sitio criado
	 * @throws Exception
	 */
	private Sitio criarSitio() throws Exception {
		Sitio sitio = new Sitio();
		sitio.setNoSitio("Seu site");
		sitio.setNoPastaArquivos("arquivosCMS");
		HttpServletRequest request = getRequest();
		if (request != null && request.getRequestURL() != null) {
			sitio.setUrl(request.getRequestURL().toString().replace("/adm/index.action", "").replace("/adm/instalar.action", "").replace("/adm/", "").replace("/adm", ""));
		} else {
			sitio.setUrl("http://localhost");
		}
		sitio.setDeSitio("S&iacute;tio padr&atilde;o criado na instala&ccedil;&atilde;o do sistema");
		sitioDao.create(sitio);
		return sitio;
	}

	private Pagina criarPaginaPrincipal(Sitio sitio, PadraoApresentacao padraoApresentacao) throws Exception {
		Pagina pagina = new Pagina();
		pagina.setDePagina("P&aacute;gina principal.");
		pagina.setNoTitulo("Principal");
		pagina.setNuSitio(sitio.getNuSitio());
		pagina.setNuPadraoApresentacao(padraoApresentacao.getNuPadraoApresentacao());
		paginaDao.create(pagina);
		sitio.setNuPaginaPrincipal(pagina.getNuPagina());
		sitioDao.update(sitio);
		return pagina;
	}

	private Conteudo criarConteudo(Pagina pagina, TipoConteudo tipoConteudo, Usuario usuario, Sitio sitio) {
		Conteudo conteudo = new Conteudo();
		conteudo.setCoOrdemDecrescente(false);
		conteudo.setDeCabecalho("Desc.: Conteudo da " + pagina.getNoTitulo());
		conteudo.setNoConteudo("Conteudo da " + pagina.getNoTitulo());
		conteudo.setNuPagina(pagina.getNuPagina());
		// Atualmente Post
		conteudo.setNuTipoConteudo(tipoConteudo.getNuTipoConteudo());
		conteudo.setNuUsuario(usuario.getNuUsuario());
		conteudo.setPagina(pagina);
		conteudo.setSitio(sitio);
		conteudo.setTipoConteudo(tipoConteudo);
		conteudo.setUsuario(usuario);

		conteudoDao.create(conteudo);
		return conteudo;
	}

	private Pagina criarPaginaContato(Sitio sitio, PadraoApresentacao padraoApresentacao) {
		Pagina pagina = new Pagina();
		pagina.setDePagina("P&aacute;gina de contato.");
		pagina.setNoTitulo("Contato");
		pagina.setNuSitio(sitio.getNuSitio());
		pagina.setNuPadraoApresentacao(padraoApresentacao.getNuPadraoApresentacao());
		paginaDao.create(pagina);
		return pagina;
	}

	/**
	 * Cria um administrador para o sitio
	 * 
	 * @param perfil
	 * @param setor
	 * @param sitio
	 * @throws Exception
	 */
	private Usuario criarAdministrador(Perfil perfil, Setor setor, Sitio sitio) throws Exception {
		Usuario usuario = new Usuario();
		usuario.setCoAtivo(true);
		usuario.setCoMatricula("");
		usuario.setCoSenha(MD5.toPassword(SENHA_INICIAL));
		usuario.setCoUsuario("admin" + sitio.getNuSitio());
		// usuario.setCoUsuario("root");
		usuario.setDtAlteracao(new Date());
		usuario.setDtCriacao(new Date());
		usuario.setNoEmail("administrador@email.com");
		usuario.setNoUsuario("Administrador");
		usuario.setNuTelefone("1234-4567");
		usuario.setNuHierarquia(1);
		usuarioDao.create(usuario);

		// Insere o novo sitio na lista do administrador
		if (usuario.getListSitio() == null) {
			usuario.setListSitio(new ArrayList<Sitio>());
		}
		usuario.getListSitio().add(sitio);

		// Define os privilegios para o administrador
		Privilegio privilegio = new Privilegio();
		privilegio.setSitio(sitio);
		privilegio.setPerfil(perfil);
		privilegio.setSetor(setor);
		privilegio.setUsuario(usuario);
		privilegioDao.create(privilegio);
		return usuario;
	}

	/**
	 * Cria o conteudistaPro respons�vel pelas insercoes de conteudo automaticas
	 * do processo acessibilizar
	 * 
	 * @param perfil
	 * @param setor
	 * @param sitio
	 * @throws Exception
	 */
	public void criarConteudistaPro() throws Exception {
		Usuario usuario = new Usuario();
		usuario.setCoAtivo(true);
		usuario.setCoMatricula("");
		usuario.setCoSenha(MD5.toPassword(SENHA_INICIAL));
		usuario.setCoUsuario("ConteudistaPro");
		usuario.setDtAlteracao(new Date());
		usuario.setDtCriacao(new Date());
		usuario.setNoEmail("conteudistapro@email.com");
		usuario.setNoUsuario("ConteudistaPro");
		usuario.setNuTelefone("1234-4567");
		usuario.setNuHierarquia(0);

		usuarioDao.create(usuario);
	}

	/**
	 * Cria os setores padrao:<br>
	 * Nenhum, Not�cias, Conte�do
	 * 
	 * @param sitio
	 * @return retorna o setor 'nenhum'
	 * @throws Exception
	 */
	public Setor criarSetores(Sitio sitio) throws Exception {

		Setor setorNenhum = new Setor();
		setorNenhum.setNoSetor("Nenhum");
		setorNenhum.setDeSetor("Colocar nesta lista os usu&aacute;rios que n&atilde;o podem alterar conte&uacute;dos");
		setorNenhum.setSitio(sitio);
		setorDao.create(setorNenhum);

		Setor setorNoticias = new Setor();
		setorNoticias.setNoSetor("Not&iacute;cias");
		setorNoticias.setDeSetor("Not&iacute;cias do s&iacute;tio " + sitio.getNoSitio());
		setorNoticias.setSitio(sitio);
		setorDao.create(setorNoticias);
		return setorNenhum;
	}

	public Setor criarSetor(Sitio sitio, String nome, String desc) throws Exception {
		Setor setor = new Setor();
		setor.setNoSetor(nome);
		setor.setDeSetor(desc);
		setor.setSitio(sitio);
		setorDao.create(setor);
		return setor;
	}

	/**
	 * Cria o perfil de administrador do sitio
	 * 
	 * @param sitio
	 * @return perfil
	 * @throws Exception
	 */
	protected Perfil criarPerfil(Sitio sitio) throws Exception {
		Perfil perfil = new Perfil();
		perfil.setNoPerfil("Administrador");
		perfil.setDePerfil("Administradores de " + sitio.getNoSitio());
		perfil.setNuHierarquia(1);
		perfil.setSitio(sitio);
		perfilDao.create(perfil);
		return perfil;
	}

	/**
	 * Cria o perfil de conteudista do sitio
	 * 
	 * @param sitio
	 * @return perfil
	 * @throws Exception
	 */
	protected Perfil criarPerfilConteudista(Sitio sitio) throws Exception {
		Perfil perfil = new Perfil();
		perfil.setNoPerfil("Conteudista");
		perfil.setDePerfil("Conteudista de " + sitio.getNoSitio());
		perfil.setNuHierarquia(1);
		perfil.setSitio(sitio);
		perfilDao.create(perfil);
		/*
		 * acoes que ele pode executar:
		 */
		perfil.setListPerfilAcao(new ArrayList<PerfilAcao>());
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "index", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "escolherSitio", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "abrirInfoPessoais", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "listarConteudo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "listarItensConteudo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "editarItemConteudo", perfil.getNuPerfil(), perfil));
		// item de conteudo
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "restaurarItemConteudo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "despublicarItemConteudo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "inserirItemConteudo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "publicarItem", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "homologarItem", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "apagarItemConteudo", perfil.getNuPerfil(), perfil));
		// arquivo
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "substituirArquivo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "listarArquivos", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "adicionarArquivo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "abrirArquivo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "atualizarArquivo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "confirmarApagarArquivo", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "apagarArquivo", perfil.getNuPerfil(), perfil));

		// Outros
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "voltar", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "logout", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "abrirAjudaPadraoApresentacao", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "buscar", perfil.getNuPerfil(), perfil));
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "buscarAdministrativo", perfil.getNuPerfil(), perfil));

		// Seguranca
		perfil.getListPerfilAcao().add(new PerfilAcao(null, "listarLog", perfil.getNuPerfil(), perfil));

		perfilDao.update(perfil);
		return perfil;
	}

	/**
	 * Cria o tipo de conteudo, atualmente Post
	 * 
	 * @param sitio
	 * @return TipoConteudo criado
	 * @throws Exception
	 */
	private TipoConteudo criarTipoConteudo(Sitio sitio) throws Exception {
		TipoConteudo tipoConteudo = new TipoConteudo();
		tipoConteudo.setDeTipoConteudo("Post padr&atilde;o com t&iacute;tulo e conte&uacute;do");
		tipoConteudo.setNoTipoConteudo("Post");
		tipoConteudo.setSitio(sitio);
		tipoConteudo.setNuSitio(sitio.getNuSitio());
		tipoConteudoDao.create(tipoConteudo);
		criarInformacaoTipoConteudo(tipoConteudo);
		return tipoConteudo;
	}

	private void criarFormato() throws Exception {
		List<Formato> list = formatoDao.list();
		if (list == null || list.size() == 0) {
			formatoDao.create(formatoTextoUmaLinha);
			formatoDao.create(formatoNumero);
			formatoDao.create(formatoImagem);
			formatoDao.create(formatoData);
			formatoDao.create(formatoTextoMultiLinha);
			formatoDao.create(formatoArquivoFlash);
			formatoDao.create(formatoLinkExterno);
			formatoDao.create(formatoLinkExternoNaoVazio);
			formatoDao.create(formatoTextoWYSIWYG);
			formatoDao.create(formatoAutoCompletavel);
			formatoDao.create(formatoArquivoDeDownload);
		} else {
			formatoTextoUmaLinha = list.get(0);
			formatoNumero = list.get(1);
			formatoImagem = list.get(2);
			formatoData = list.get(3);
			formatoTextoMultiLinha = list.get(4);
			formatoArquivoFlash = list.get(5);
			formatoLinkExterno = list.get(6);
			formatoLinkExternoNaoVazio = list.get(7);
			formatoTextoWYSIWYG = list.get(8);
			formatoAutoCompletavel = list.get(9);
			formatoArquivoDeDownload = list.get(10);
		}
	}

	private void criarInformacaoTipoConteudo(TipoConteudo tipoConteudo) throws Exception {
		formatoTextoUmaLinha = formatoDao.select(Gerenciador.TIPO_TEXTO);
		formatoTextoWYSIWYG = formatoDao.select(Gerenciador.TIPO_RTF);

		InformacaoTipoConteudo informacaoTipoConteudo = new InformacaoTipoConteudo();
		informacaoTipoConteudo.setCoAtivo(true);
		informacaoTipoConteudo.setDeDicaPreenchimento("Digite o conte&uacute;do");
		informacaoTipoConteudo.setFormato(formatoTextoWYSIWYG);
		informacaoTipoConteudo.setNoTag("conteudo");
		informacaoTipoConteudo.setNoInformacao("Conte&uacute;do");
		informacaoTipoConteudo.setNuFormato(formatoTextoWYSIWYG.getNuFormato());
		informacaoTipoConteudo.setNuOrdem(1);
		informacaoTipoConteudo.setNuTipoConteudo(tipoConteudo.getNuTipoConteudo());// post
		informacaoTipoConteudoDao.create(informacaoTipoConteudo);

		informacaoTipoConteudo = new InformacaoTipoConteudo();
		informacaoTipoConteudo.setCoAtivo(true);
		informacaoTipoConteudo.setDeDicaPreenchimento("Digite o autor");
		informacaoTipoConteudo.setFormato(formatoTextoUmaLinha);
		informacaoTipoConteudo.setNoTag("autor");
		informacaoTipoConteudo.setNoInformacao("Fonte/Autor");
		informacaoTipoConteudo.setNuFormato(formatoTextoUmaLinha.getNuFormato());
		informacaoTipoConteudo.setNuOrdem(2);
		informacaoTipoConteudo.setNuTipoConteudo(tipoConteudo.getNuTipoConteudo());// post
		informacaoTipoConteudoDao.create(informacaoTipoConteudo);

	}

	/**
	 * Cria o perfil, setor, etc.
	 * 
	 * @param sitio
	 * @return sitio com setor, perfil, etc
	 * @throws Exception
	 */
	public Sitio criarSitioBase(Sitio sitio) throws Exception {
		Perfil perfilAdministrador = criarPerfil(sitio);
		// TODO criar um usuario conteudista
		Perfil perfilConteudista = criarPerfilConteudista(sitio);
		Setor setorNenhum = criarSetores(sitio);
		Setor setorConteudista = criarSetor(sitio, "Conteudistas", "Todos os conteudistas");
		Usuario admSitio = criarAdministrador(perfilAdministrador, setorNenhum, sitio);
		Menu menuPrincipal = criarMenuPrincipal(sitio);

		TipoConteudo post = criarTipoConteudo(sitio);
		criarTipoConteudoListaPaginasMenu(sitio);

		PadraoApresentacao padraoApresentacao = criarPadraoApresentacao(sitio);
		Pagina paginaPrincipal = criarPaginaPrincipal(sitio, padraoApresentacao);
		Pagina paginaContato = criarPaginaContato(sitio, padraoApresentacao);

		Conteudo conteudoPrincipal = criarConteudo(paginaPrincipal, post, admSitio, sitio);
		criarConteudo(paginaContato, post, admSitio, sitio);

		setorConteudista.setListConteudo(new ArrayList<Conteudo>());
		setorConteudista.getListConteudo().add(conteudoPrincipal);

		criarItemMenu("Principal", paginaPrincipal, menuPrincipal);
		criarItemMenu("Contatos", paginaContato, menuPrincipal);

		Privilegio privilegio = new Privilegio();
		// Insere o novo sitio na lista do root administrador
		Usuario usuario = null;
		if (rootSys != null) {
			usuario = rootSys;
		} else {
			usuario = usuarioDao.select(1L);
		}
		if (usuario.getListSitio() == null) {
			usuario.setListSitio(new ArrayList<Sitio>());
		}
		usuario.getListSitio().add(sitio);

		// Define os privilegios para o root administrador
		privilegio.setSitio(sitio);
		privilegio.setPerfil(perfilAdministrador);
		privilegio.setSetor(setorNenhum);
		privilegio.setUsuario(usuario);
		privilegioDao.create(privilegio);
		return sitio;
	}

	private void criarTipoConteudoListaPaginasMenu(Sitio sitio) throws Exception {
		TipoConteudo tipoConteudo = new TipoConteudo();
		tipoConteudo.setDeTipoConteudo("Listagem de paginas de acordo com um itemDeMenu");
		tipoConteudo.setNoTipoConteudo("ListaPaginasMenu");
		tipoConteudo.setSitio(sitio);
		tipoConteudo.setNuSitio(sitio.getNuSitio());
		tipoConteudoDao.create(tipoConteudo);
		// Para garantir que esta utilizando o persistido
		formatoNumero = formatoDao.select(Gerenciador.TIPO_NUMERO);
		InformacaoTipoConteudo informacaoTipoConteudo = new InformacaoTipoConteudo();
		informacaoTipoConteudo.setCoAtivo(true);
		informacaoTipoConteudo.setDeDicaPreenchimento("N&uacute;mero do menu para listar as p&aacute;ginas");
		informacaoTipoConteudo.setFormato(formatoNumero);
		informacaoTipoConteudo.setNoTag("nuMenu");
		informacaoTipoConteudo.setNoInformacao("N&uacute;mero do menu para listar as p&aacute;ginas");
		informacaoTipoConteudo.setNuFormato(formatoNumero.getNuFormato());
		informacaoTipoConteudo.setNuOrdem(1);
		informacaoTipoConteudo.setNuTipoConteudo(tipoConteudo.getNuTipoConteudo());
		informacaoTipoConteudoDao.create(informacaoTipoConteudo);
	}
}
